package com.exampleyyy.demoyyy.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
//从苞米豆模块导入匿名查询对象,省去写SQL的过程
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
// 导入分页类
import com.exampleyyy.demoyyy.JieKouService.EmployeeServiceJieKou;
//  导入服务层接口
import com.exampleyyy.demoyyy.SHITIYYY.Employee;
import com.exampleyyy.demoyyy.common.R;
import org.springframework.beans.factory.annotation.Autowired;
// 导入  自动装配 功能
import org.springframework.dao.DuplicateKeyException;
import org.springframework.util.DigestUtils;
// 导入加密工具
import org.springframework.web.bind.annotation.*;
// 导入  接受 Post请求的映射类
// 导入 接受请求映射类

import javax.servlet.http.HttpServletRequest;
// 导入  控制层类

@RestController
@RequestMapping("/employee")// 捕捉主路由
public class EmployeeContoller {
    // 1.普通类变成控制器类
    // 2.装配服务层接口
    @Autowired // 自动装配
    private EmployeeServiceJieKou fuwujiekou;
    // 3.网络接口开发,让控制器类,捕捉主路由,让控制器类里的函数,捕捉子路由
    @PostMapping("/login")//登录接口
    public  R<Object>  login(HttpServletRequest request, @RequestBody Employee emp ){
         // 0. 获取携带来的数据,登录函数,添加参数
        // 参数1:参数名叫request,参数类型是 HTTP的Request请求类型
        //参数2: 参数名emp,参数类型 请求体类型 @RequestBody 员工实体类的对象
        System.out.println("前端传来的用户名是"+emp.getUsername());
        System.out.println("前端传来的密码是"+emp.getPassword());
        System.out.println("前端传来的密码转为字节类型是"+emp.getPassword().getBytes());
        // 1.明文密码 123456加密成密文,使用md5加密算法,该算法特点,只能加密,不能解密,单向加密过程
        // 1.1 明文密码123456转成字节类型 bytes ,相当于加盐
        String  miwen = DigestUtils.md5DigestAsHex(emp.getPassword().getBytes());
        //加密工具的md5算法Hex十六进制加密 参数是密码转成字节的类型
        System.out.println("加密后的密文是"+miwen);
        // 2.使用用户名,查询数据库,有没有这个用户
        // 2.1使用苞米豆依赖,创建一个匿名查询对象
        LambdaQueryWrapper<Employee>  chaxunduixiang = new LambdaQueryWrapper();
        //   对象类型   员工实体类           对象名        创建对象  匿名查询类
        //2.2 将前端携带来的用户名 赋值 给 匿名查询对象
        chaxunduixiang.eq(Employee::getUsername,emp.getUsername());
        // emp.getUsername()前端过来的用户名
        // chaxunduixiang.eq() ,给匿名对象赋值 eq
        // Employee::getUsername   ::代表一个过程
        //2.3 调用服务层接口,传递参数,参数是查询对象,查询一条数据
        Employee TableResult = fuwujiekou.getOne(chaxunduixiang);//相当于执行SQL select * from employee where username="admin";
        System.out.println("数据库查询结果是"+TableResult);
        if(TableResult==null){
            return R.error(0,"用户名错误",null);
        }
        // 3.如果,有这个用户名,那么继续比对密文,数据库的密文,比对前端过来并加密后的密文
       if(TableResult.getPassword().equals(miwen)){
           // 4.如果密文比对成功
           //  在这里设置一个session
           request.getSession().setAttribute("员工信息id",TableResult.getId());
           //session 存储的格式是  键值对   {"员工信息id":1}
           return R.success(1,"用户名密码正确",TableResult);
       }else{
           // 5.如果密文对比失败,那么提示密码错误
           return R.error(0,"密码错误",null);
       }
    }
    // 退出函数
    @PostMapping("/logout") // 推出接口
    public  R<Object> logout(HttpServletRequest request){
        System.out.println("进入到退出函数了,我打印了");
        // 清除session
        request.getSession().removeAttribute("员工信息id");
        return  R.success(1,"退出成功",null);
    }

    @PostMapping("") // 添加员工接口
    public  R<Object>  addyuangong(HttpServletRequest request,@RequestBody Employee emp){
        // 参数1 请求对象  参数2 请求体
        System.out.println("前端刚来的时候的emp"+emp);
        // 1.数据库有12列数据,前端只能提供5列数据,数据库默认2列,自己后台手动添加5列
        // 先补充密码,默认密码123456 要使用md5加密成密文
       String  MoRenmiwen = DigestUtils.md5DigestAsHex("123456".getBytes());
       emp.setPassword(MoRenmiwen);// 添加密码属性 加上密文
       System.out.println("emp添加密文之后的emp"+emp);
      // emp.setCreate_time(LocalDateTime.now()); // 添加本地当前时间
       //emp.setUpdate_time(LocalDateTime.now());
       System.out.println("添加时间之后的emp"+emp);
       // 添加创建人，更新人
       // Long empid = (Long) request.getSession().getAttribute("员工信息id");
       // emp.setUpdate_user(empid); // 使用session记录
       // emp.setCreate_user(empid);
        // 调用服务层接口，存储这个emp 到数据库
        try{  // 添加代码冗余，异常捕获
            fuwujiekou.save(emp);// 相当于执行SQL语句  insert into employee valuse (.........)
            return R.success(1,"添加员工成功",null);
        } catch (DuplicateKeyException eee ){
            System.out.println(eee);
            return R.error(0,"添加员工失败,用户名重复",null);
        }
    }

    @GetMapping("/page") // 查询接口，携带请求参数
    public R<Object>  chaxunyuangong(int page,int pageSize,String name){
        // 参数1 当前第几页  参数2  当前页放多少条 参数3  搜索的员工姓名
        // 查询数据库,员工数据表,查询后的结果,返回给DATA
        //1.创建查询对象
        LambdaQueryWrapper<Employee>  chaxunduixiang = new LambdaQueryWrapper();
        // 2. 创建分页对象
        Page  fenyeduixiang =  new Page(page,pageSize);
        //添加过滤条件
        if(name!=null){ // 如果name 有值
            chaxunduixiang.like(true,Employee::getName,name);// 模糊查询 mysql
            fuwujiekou.page(fenyeduixiang, chaxunduixiang);
            return R.success(1,"搜索成功",fenyeduixiang);
        };
        //3.调用服务层接口,使用分页方法,传入查询对象,
        try { // 异常捕获
            fuwujiekou.page(fenyeduixiang, chaxunduixiang);
            // select *  from  employee;
            // page方法传递两个参数,第二个参数是查询对象Wrapper
            // 第一个参数分页参数
        } catch ( Exception yichang){
            System.out.println("查询数据库错误,检查代码118行");
            R.error(0,"查询员工失败",null);
        }
        return  R.success(1,"查询员工成功",fenyeduixiang);
    }

    @PutMapping("")//修改员工接口
    public  R<Object> xiugaiyuangong(HttpServletRequest request,@RequestBody Employee emp){
        // 1.获取前端携带来的请求体数据,赋值给emp对象
        System.out.println("打印前端请求体给了emp:"+emp);
        // 1.1 更新emp属性中的修改人和修改时间,当前时间就是修改时间
       // emp.setUpdate_time(LocalDateTime.now());
        // 获取session,获取当前账号人,就是修改人
        Long sessionid   = (Long) request.getSession().getAttribute("员工信息id");
      //  emp.setUpdate_user(sessionid);
        System.out.println("再次打印emp对比之前的emp:"+emp);
        // 2.调用服务层接口更新数据
        fuwujiekou.updateById(emp); // id=1712644761670660000  status=0
        // update employee set status=0 where id =1712644761670660097;
        return  R.success(1,"修改测试",null);

    }

    @GetMapping("/{id}") // 编辑员工接口   {id} 插值语法 路由变量
    public  R<Object>  bianjiyuangong(@PathVariable Long id ){
        // 参数, 接收 路由上传递来的值
        Employee emp = fuwujiekou.getById(id);
        if(emp!=null){
            return R.success(1,"查询这个员工成功",emp);
        }else{
            return R.error(0,"查无此人",null);
        }
    }
}


